#ifndef P2P_BASE_ASYNCSTUNTCPSOCKET_H_
#define P2P_BASE_ASYNCSTUNTCPSOCKET_H_

#include "base/asynctcpsocket.h"

namespace cricket
{
	class AsyncStunTCPSocket : public base::AsyncTCPSocketBase
	{
	public:
		// Binds and connects |socket| and creates AsyncTCPSocket for
		// it. Takes ownship of |socket|. Returns NULL if bind() or
		// connect() fail (|socket| is destroyed in that case).
		static AsyncStunTCPSocket* Create(base::AsyncSocket* socket, 
			const base::SocketAddress& bind_address, 
			const base::SocketAddress& remote_address);

		AsyncStunTCPSocket(base::AsyncSocket* socket, bool listen);
		virtual ~AsyncStunTCPSocket() {}

		virtual int Send(const void* pv, size_t cb);
		virtual void ProcessInput(char* data, size_t* len);
		virtual void HandleIncomingConnection(base::AsyncSocket* socket);

	private:
		// This method returns the message hdr + length written in the header.
		// This method also returns the number of padding bytes needed/added to the
		// turn message. |pad_bytes| should be used only when |is_turn| is true.
		size_t GetExpectedLength(const void* data, size_t len, int* pad_bytes);

		DISALLOW_EVIL_CONSTRUCTORS(AsyncStunTCPSocket);
	};
} // namespace cricket

#endif	// P2P_BASE_ASYNCSTUNTCPSOCKET_H_